Java: Ví dụ Commit và Rollback


Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên

Để thực hiện quản lý Transaction cho riêng mình, đầu tiên bạn cần tắt chế độ auto-commit bằng cách truyền tham số false cho phương thức setAutoCommit().

Sau đó, khi bạn đã thực hiện các thay đổi với cơ sở dữ liệu và muốn ký thác (commit) các thay đổi đó, bạn sử dụng phương thức commit(). Hoặc bạn muốn xóa các thay đổi đã được thực hiện trước đó để quay về trạng thái trước khi thực hiện thay đổi khi thấy rằng có lỗi xảy ra, bạn sử dụng phương thức rollback().

Dưới đây là ví dụ minh họa cho hai hoạt động trên.

package solutions;

//Bước 1: import các package cần thiết
import java.sql.*;

public class ViDuJDBC {
  // Tên của driver và địa chỉ URL của cơ sở dữ liệu (DB)
  static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
  static final String DB_URL = "jdbc:mysql://localhost/sinhvien";

  // Tên đăng nhập và mật khẩu của DB
  static final String USER = "root";
  static final String PASS = "";

  public static void main(String[] args) {
    Connection conn = null;
    Statement stmt = null;
    try {
      // Bước 2: Đăng ký Driver
      Class.forName(JDBC_DRIVER);

      // Bước 3: Mở một kết nối
      System.out.println("Đang kết nối tới cơ sở dữ liệu ...");
      conn = DriverManager.getConnection(DB_URL, USER, PASS);

      // Bước 4: Thiết lập auto commit là false.
      conn.setAutoCommit(false);

      // Bước 5: Thực thi truy vấn
      System.out.println("Tạo các lệnh truy vấn SQL ...");
      stmt = conn.createStatement(
        ResultSet.TYPE_SCROLL_INSENSITIVE,
        ResultSet.CONCUR_UPDATABLE);

      // Bước 6: Chèn một hàng vào bảng sinhvien
      System.out.println("\nChèn một hàng ...");
      String SQL = "INSERT INTO sinhvienk60 " +
        "VALUES (5, 'Trần Văn', 'Anh', 7.5)";
      stmt.executeUpdate(SQL);

      // Bước 7: Chèn thêm một hàng vào bảng sinhvien
      SQL = "INSERT INTO sinhvienk60 " +
        "VALUES (6, 'Trương Vũ', 'Bình', 6.5)";
      stmt.executeUpdate(SQL);

      // Bước 8: Ký thác (commit) các thay đổi
      System.out.println("\nKy thac cac thay doi ...");
      conn.commit();

      // Bước 9: Liệt kê tất cả các bản ghi.
      String sql = "SELECT mssv, ho, ten, diemthi FROM sinhvienk60";
      ResultSet rs = stmt.executeQuery(sql);
      System.out.println("\nLDanh sách sinh viên:");
      printRs(rs);

      // Bước 10: Dọn sạch môi trường và giải phóng tài nguyên (resource)
      rs.close();
      stmt.close();
      conn.close();
    } catch (SQLException se) {
      // Xử lý các lỗi cho JDBC
      se.printStackTrace();
      // Nếu xuất hiện lỗi thì xóa sạch các thay đổi
      // và trở về trạng thái trước khi có thay đổi.
      System.out.println("\nQuay về trạng thái trước khi có sự thay đổi ...");
      try {
        if (conn != null)
          conn.rollback();
      } catch (SQLException se2) {
        se2.printStackTrace();
      }
    } catch (Exception e) {
      // Xử lý các lỗi cho Class.forName
      e.printStackTrace();
    } finally {
      // Khối finally được sử dụng để đóng các resource
      try {
        if (stmt != null)
          stmt.close();
      } catch (SQLException se2) {
      }
      try {
        if (conn != null)
          conn.close();
      } catch (SQLException se) {
        se.printStackTrace();
      }
    }
    System.out.println("\nKết thúc!");
  }

  public static void printRs(ResultSet rs) throws SQLException {
    // Đảm bảo ta đã bắt đầu từ hàng đầu tiên
    rs.beforeFirst();
    while (rs.next()) {
      // Lấy dữ liệu thông qua truy xuất đến tên cột
      int mssv = rs.getInt("mssv");
      int diemthi = rs.getInt("diemthi");
      String ho = rs.getString("ho");
      String ten = rs.getString("ten");

      // Hiển thị các giá trị
      System.out.print("\nMSSV: " + mssv);
      System.out.print("\nHọ: " + ho);
      System.out.println("\nTên: " + ten);
      System.out.print("\nĐiểm thi: " + diemthi);
      System.out.print("\n=================");
    }
    System.out.println();
  }
}
» Tiếp: Kết nối Cơ sở dữ liệu Java với MySQL
« Trước: Cách kết nối tới các RDBMS trong Java JDBC
Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên
Copied !!!